/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pl.tewi.jeeunit.junit4.statements;

import javax.transaction.UserTransaction;
import org.junit.runners.model.FrameworkMethod;
import org.junit.runners.model.Statement;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import pl.tewi.jeeunit.annotations.Transactional;
import pl.tewi.jeeunit.contexts.ApplicationServerContext;
import pl.tewi.jeeunit.controller.ServerControllerFactory;

/**
 * Statement rozpoczynający transakcję. Transakcję należy pobrać z serwera 
 * aplikacyjnego. Kłopotem jest tutaj różne nazewnistwo sotosowane w przypadku
 * serwerów aplikacyjnych w jndi. Dla glassfish jest to UserTransaction
 * @author tewi
 */
public class BeginTransaction extends BaseFrameworkStatement {

    private static final Logger LOGGER = LoggerFactory.getLogger(BeginTransaction.class.getName());
    private final FrameworkMethod method;

    /**
     * 
     * @param statement
     * @param context
     * @param method
     */
    public BeginTransaction(Statement statement, ApplicationServerContext context, FrameworkMethod method) {
        super(statement, context);
        this.method = method;
    }

    @Override
    public void evaluate() throws Throwable {
        //rozpocznij transakcję
        LOGGER.debug("TransactionBegin");
        //jeżeli na metodzie jest adnotacja o transakcyjności to
        Transactional transactional = method.getAnnotation(Transactional.class);
        if (transactional != null) {
            UserTransaction tx = ServerControllerFactory.getServerController(applicationServerContext).getCurrentTransaction();
            tx.begin();
            //jezeli jest rollback na adnotacji to 
            if (transactional.rolback()) {
                tx.setRollbackOnly();
            }
            //parametr o limicie czasu transakcji
            tx.setTransactionTimeout(transactional.timeout());
        }
        fNext.evaluate();
    }
}
